﻿using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace FiltroMultiploGridview
{

    public class CampoDoFiltro
    {
        public string Nome { get; private set; }
        public int MaxCaracteres { get; private set; }

        public CampoDoFiltro(string Nome, int MaxCaracteres)
        {
            this.Nome = Nome;
            this.MaxCaracteres = MaxCaracteres;
        }

    }

    public class FiltroAutomatico
    {
        private GridView _gv;
        private CampoDoFiltro[] _Campos;
        private SqlDataSource _ds;

        public FiltroAutomatico(GridView gv, SqlDataSource ds, CampoDoFiltro[] campos)
        {
            _gv = gv;
            _Campos = campos;
            _ds = ds;
            _gv.RowCreated += FiltroAutomatico_RowCreated;
            _gv.RowDataBound += FiltroAutomatico_RowDataBound;
        }

        private void FiltroAutomatico_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            string fexpression = "";
            if (e.Row.RowType == DataControlRowType.Header)
            {
                OrganizaFilterExpression ofe = new OrganizaFilterExpression();
                foreach (CampoDoFiltro campo in _Campos)
                {
                    DropDownList ddlItens = (DropDownList)e.Row.FindControl("ddl" + campo.Nome);

                    RemoveDuplicados(ddlItens);

                    //percorre os itens limitando a quantidade de caracteres se for maior que 0 a quantidade
                    if (campo.MaxCaracteres > 0)
                    {
                        foreach (ListItem item in ddlItens.Items)
                        {
                            item.Text = item.Text.Length > campo.MaxCaracteres ? item.Text.Substring(0, campo.MaxCaracteres - 3) + "..." : item.Text;
                        }
                    }

                    string ItemSelecionado = HttpContext.Current.Request.Form[ddlItens.UniqueID];

                    if (!System.String.IsNullOrEmpty(ItemSelecionado))
                    {
                        ofe.AdicionaParametro(campo.Nome, ItemSelecionado);
                    }
                    //seleciona novamente o item que estava selecionado no dropdownlist
                    foreach (ListItem dItem in ddlItens.Items)
                    {
                        if (dItem.Value == ItemSelecionado)
                        {
                            dItem.Selected = true;
                        }
                    }
                }

                fexpression = ofe.ToString();

                _ds.FilterExpression = fexpression;
            }
        }

        private void FiltroAutomatico_RowCreated(object sender, GridViewRowEventArgs e)
        {
            //Adiciona os DropDownLists com os itens da coluna
            //Adiciona cada um dos DropDownLists da array de acordo com o nome do campo
            if (e.Row.RowType == DataControlRowType.Header)
            {
                foreach (CampoDoFiltro campo in _Campos)
                {
                    DropDownList ddlItens = new DropDownList();
                    ddlItens.Items.Add(new ListItem("", ""));
                    ddlItens.AppendDataBoundItems = true;
                    ddlItens.ID = "ddl" + campo.Nome;

                    //passa o datasource para um DataView, para ordenar
                    DataView dvOrdenacao = (DataView)_ds.Select(DataSourceSelectArguments.Empty);
                    dvOrdenacao.Sort = campo.Nome;

                    ddlItens.DataSource = dvOrdenacao;
                    ddlItens.DataTextField = campo.Nome;
                    ddlItens.DataValueField = campo.Nome;
                    ddlItens.AutoPostBack = true;
                    ddlItens.EnableViewState = false;
                    ddlItens.DataBind();

                    foreach (DataControlFieldCell c in e.Row.Cells)
                    {
                        if (c.ContainingField is BoundField)
                        {
                            if (((BoundField)c.ContainingField).DataField == campo.Nome)
                            {
                                c.Controls.Add(ddlItens);                             
                            }
                        }
                    }
                }


            }
        }

        private static void RemoveDuplicados(DropDownList ddl)
        {
            List<string> itensUnicos = new List<string>();

            foreach (ListItem listItem in ddl.Items)
            {
                if (!itensUnicos.Contains(listItem.Value))
                {
                    itensUnicos.Add(listItem.Value);
                }
            }

            //limpa o dropdownlist e adiciona somente os itens únicos
            ddl.Items.Clear();

            foreach (string i in itensUnicos)
            {
                ddl.Items.Add(new ListItem(i, i));
            }

            ddl.SelectedIndex = -1;
        }

    }
}